home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Alpha / Whiteline Alpha.iso / progtool / modula2 / hk_lib / def_mod / strings.def < prev    next >
Encoding:
Modula Definition  |  1994-09-22  |  20.7 KB  |  353 lines

  1. DEFINITION MODULE  Strings;
  2.  
  3. (*****************************************************************************)
  4. (* Das Modul stellt Prozeduren zur Verarbeitung von 'Strings' zur Verfue-    *)
  5. (* gung. Strings bestehen aus einem eindimensionalen Feld von Einzelzeichen: *)
  6. (*                                                                           *)
  7. (*   z.B. String10 = ARRAY [0..9] OF CHAR;                                   *)
  8. (*                                                                           *)
  9. (* Das Modul definiert auch einige Standard-Stringtypen.                     *)
  10. (* Die Laenge eines Strings ist allerdings nicht durch die statische Defi-   *)
  11. (* nition im Programmtext festgelegt, sondern wird dynamisch zur Laufzeit    *)
  12. (* bestimmt ( Length( string ) ).                                            *)
  13. (*                                                                           *)
  14. (* Als Endekennung gilt folgende ( allgemein uebliche ) Konvention:          *)
  15. (*                                                                           *)
  16. (*   1. Das Ende eines Strings wird durch ein Nullbyte ( = TermChar ) hinter *)
  17. (*      dem letzten Buchstaben gekennzeichnet, falls der Platz dazu in dem   *)
  18. (*      Feld ausreicht.                                                      *)
  19. (*                                                                           *)
  20. (*   2. Das Ende des Strings ist durch den maximalen Index des Feldes        *)
  21. (*      ( ermittelt durch HIGH( string ) ) gegeben, falls der String so viele*)
  22. (*      Buchstaben wie das Feld Zeichen hat, dann ist naemlich kein Platz    *)
  23. (*      fuer das Nullbyte.                                                   *)
  24. (*                                                                           *)
  25. (* Der Compiler selber benutzt auch diese Endekennung: Bei der Zuweisung     *)
  26. (* eines konstanten Textes an eine Stringvariable wird ein Nullbyte ange-    *)
  27. (* fuegt, falls noch Platz ist. Ruft man eine Prozedur mit einem konstanten  *)
  28. (* Text als Parameter auf, wird ein Feld uebergeben, das genausoviele Zeichen*)
  29. (* hat wie der String - ein Nullbyte wird nicht angefuegt.                   *)
  30. (*                                                                           *)
  31. (* Obwohl bei der Definition eines Strings womoeglich der Index bei Null be- *)
  32. (* ginnt, beginnt die Zaehlung der Buchstaben bei den Prozeduren, die eine   *)
  33. (* Positionsangabe benoetigen, bei eins ! D.h. der erste Buchstabe des       *)
  34. (* Strings hat die Position eins.                                            *)
  35. (*                                                                           *)
  36. (* Die Prozeduren sind so ausgelegt, dass die Operationen scheinbar mit Hilfe*)
  37. (* >endlos< langer Strings ausgefuehrt werden, und was nachher nicht in den  *)
  38. (* Ergebnisstring passt, wird einfach abgeschnitten. Ueber die Variable      *)
  39. (* 'vollst' kann man dann erfahren, ob der Zielstring das vollstaendige      *)
  40. (* Ergebnis enthaelt.                                                        *)
  41. (*                                                                           *)
  42. (* Da viele Programme nur die grundlegenden Stringfunktionen benoetigen -    *)
  43. (* wenn ueberhaupt -, sind diese hier zusammengefasst. Neben den gegenueber  *)
  44. (* dem Wirth'schen Standardmodul leicht erweiterten Funktionen, sind noch    *)
  45. (* Funktionen fuer die Verwendung von Einzelzeichen in Strings vorgesehen;   *)
  46. (* konstante Einzelzeichen, also z.B. 'b', koennen auch direkt mit den       *)
  47. (* Stringprozeduren verarbeitet werden, da sie kompatibel mit Strings der    *)
  48. (* Laenge eins sind.                                                         *)
  49. (*                                                                           *)
  50. (* Hinweis: Die Angabe von Null als Wert fuer Prozeduren, die eine Positions-*)
  51. (* angabe benoetigen, erzeugt meistens sinnvolle Ersatzwerte; z.B erspart    *)
  52. (* man sich die Berechnung der Stringlaenge, bei Prozeduren, die vom Ende    *)
  53. (* des Strings aus suchen.                                                   *)
  54. (*___________________________________________________________________________*)
  55. (*  07-Feb-90 , Holger Kleinschmidt                                          *)
  56. (*****************************************************************************)
  57.  
  58.  
  59.  
  60.   TYPE  CompareResult = ( less, equal, greater );
  61.  
  62.  
  63.         StrChar = ARRAY [0..  0] OF CHAR; (* z.B fuer die platzsparende   *)
  64.                                           (* Umwandlung einer CHAR-Varia- *)
  65.                                           (* blen in einen String.        *)
  66.         Str20   = ARRAY [0.. 19] OF CHAR;
  67.         Str80   = ARRAY [0.. 79] OF CHAR;
  68.         Str256  = ARRAY [0..255] OF CHAR;
  69.  
  70. (*___________________________________________________________________________*)
  71.  
  72.  
  73.   PROCEDURE  Length ((* EIN/ -- *)  string : ARRAY OF CHAR ): CARDINAL;
  74.  
  75. (*---------------------------------------------------------------------------
  76.  | Ermittelt die Laenge eines Strings zur Laufzeit. Wenn der String leer ist |
  77.  | ( IsEmptyStr ), bekommt man eine Null.                                    |
  78.   ---------------------------------------------------------------------------*)
  79.  
  80.  
  81.   PROCEDURE  ClearStr   ((* -- /AUS *) VAR string: ARRAY OF CHAR );
  82.  
  83.   PROCEDURE  IsEmptyStr ((* EIN/ -- *)     string: ARRAY OF CHAR ):BOOLEAN;
  84.  
  85. (*---------------------------------------------------------------------------
  86.  | Erzeugt einen Leerstring, bzw. testet, ob ein String leer ist             |
  87.   ---------------------------------------------------------------------------*)
  88.  
  89.  
  90.  
  91.   PROCEDURE  Assign ((* EIN/ -- *)     quelle : ARRAY OF CHAR;
  92.                      (* -- /AUS *) VAR ziel   : ARRAY OF CHAR;
  93.                      (* -- /AUS *) VAR vollst : BOOLEAN       );
  94.  
  95. (*---------------------------------------------------------------------------
  96.  | Zuweisung von Strings. Falls <ziel> den String <quelle> nicht vollstaen-  |
  97.  | dig aufnehmen kann, wird nur bis zum Ende von <ziel> kopiert und es gilt: |
  98.  |  <vollst> = FALSE.                                                        |
  99.   ---------------------------------------------------------------------------*)
  100.  
  101.  
  102.   PROCEDURE  Concat ((* EIN/ -- *)     quelle1,
  103.                      (* EIN/ -- *)     quelle2 : ARRAY OF CHAR;
  104.                      (* -- /AUS *) VAR ziel    : ARRAY OF CHAR;
  105.                      (* -- /AUS *) VAR vollst  : BOOLEAN       );
  106.  
  107. (*---------------------------------------------------------------------------
  108.  | Zusammenfuegen von Strings. <quelle2> wird an <quelle1> hinten dran ge-   |
  109.  | haengt und das ganze nach <ziel> kopiert, allerdings nur soviel wie <ziel>|
  110.  | aufnehmen kann. Konnte <ziel> nicht alles aufnehmen, gilt:                |
  111.  |   <vollst> = FALSE.                                                       |
  112.   ---------------------------------------------------------------------------*)
  113.  
  114.  
  115.   PROCEDURE  Delete ((* EIN/AUS *) VAR string : ARRAY OF CHAR;
  116.                      (* EIN/ -- *)     start,
  117.                      (* EIN/ -- *)     laenge : CARDINAL      );
  118.  
  119. (*---------------------------------------------------------------------------
  120.  | Ab dem <start>-ten Zeichen werden <laenge> Zeichen aus <string> entfernt. |
  121.  |  - <start> = 0 bedeutet das gleiche wie <start> = 1; es wird also beim    |
  122.  |    ersten Zeichen begonnen.                                               |
  123.  |  - Liegt <start> ausserhalb des Strings, passiert gar nichts.             |
  124.  |  - Liegt <start> + <laenge> ausserhalb des Strings, wird nur bis zum Ende |
  125.  |    von <string> geloescht.                                                |
  126.   ---------------------------------------------------------------------------*)
  127.  
  128.  
  129.  
  130.   PROCEDURE  Insert ((* EIN/ -- *)     insert : ARRAY OF CHAR;
  131.                      (* EIN/ -- *)     start  : CARDINAL;
  132.                      (* EIN/AUS *) VAR string : ARRAY OF CHAR;
  133.                      (* -- /AUS *) VAR vollst : BOOLEAN       );
  134.  
  135. (*---------------------------------------------------------------------------
  136.  | Ab dem <start>-ten Zeichen wird <insert> in <string> eingefuegt.          |
  137.  |  - <start> = 0  <=>  <start> = 1                                          |
  138.  |  - Liegt <start> ausserhalb von <string>, wird <insert> hinten angefuegt  |
  139.  |     ( => 'Concat' )                                                       |
  140.  |  - Ist <insert> ein Leerstring, passiert gar nichts                       |
  141.  |  - Falls das Ergebnis nicht mehr in <quelle1> passt, wird der hintere Rest|
  142.  |    abgeschnitten und es gilt   <vollst> = FALSE                           |
  143.   ---------------------------------------------------------------------------*)
  144.  
  145.  
  146.   PROCEDURE  EqualStr    ((* EIN/ -- *) string1,
  147.                           (* EIN/ -- *) string2 : ARRAY OF CHAR ): BOOLEAN;
  148.  
  149.   PROCEDURE  EqualCAPStr ((* EIN/ -- *) string1,
  150.                           (* EIN/ -- *) string2 : ARRAY OF CHAR ): BOOLEAN;
  151.  
  152. (*---------------------------------------------------------------------------
  153.  | Vergleichen <string1> und <string2> zeichenweise miteinander; fuer den    |
  154.  | Vergleich ist die Endemarkierung der Strings ohne Bedeutung,d.h. wenn z.B.|
  155.  | <string1> durch ein Nullbyte abgeschlossen ist, <string2> aber durch das  |
  156.  | Ende des Feldes, und beide Strings sind sonst gleich, so liefert auch     |
  157.  | diese Funktion TRUE.                                                      |
  158.  | "EqualCAPStr" unterscheidet nicht zwischen Gross- und Kleinschreibung.    |
  159.  | Diese Prozeduren sind als schneller Ersatz fuer "Compare" bei der Komman- |
  160.  | doanalyse o.ae. gedacht.                                                  |
  161.   ---------------------------------------------------------------------------*)
  162.  
  163.  
  164.  
  165.   PROCEDURE  Compare ((* EIN/ -- *) string1,
  166.                       (* EIN/ -- *) string2 : ARRAY OF CHAR ): CompareResult;
  167.  
  168. (*---------------------------------------------------------------------------
  169.  | Vergleicht <string1> und <string2> zeichenweise miteinander.              |
  170.  | Das Ergebnis wird folgendermassen gebildet ( lexikographische Ordnung ):  |
  171.  |                                                                           |
  172.  |  - Beim ersten Zeichen von <string1>, dass kleiner ( groesser ) als das   |
  173.  |    entsprechende Zeichen bei <string2> ist, wird 'less' ('greater') zu-   |
  174.  |    rueckgeliefert.                                                        |
  175.  |  - Sind beide Strings gleichlang ( Endekennung spielt keine Rolle !! ),   |
  176.  |    und stimmen die Zeichen bis zum Ende ueberein, wird 'equal' zurueckge- |
  177.  |    liefert.                                                               |
  178.  |  - Ist <string1> kuerzer (laenger) als <string2> und stimmen bis zur      |
  179.  |    Laenge von <string1> ( <string2> ) alle Zeichen ueberein, wird 'less'  |
  180.  |    ('greater') zurueckgeliefert.                                          |
  181.  |                                                                           |
  182.  | "Compare" vergleicht wirklich nur den ASCII-Wert der einzelnen Zeichen;   |
  183.  | dabei ist also z.B. 'A' groesser als 'z' !                                |
  184.   ---------------------------------------------------------------------------*)
  185.  
  186.  
  187.  
  188.   PROCEDURE  LeftPos  ((* EIN/ -- *) muster : ARRAY OF CHAR;
  189.                        (* EIN/ -- *) start  : CARDINAL;
  190.                        (* EIN/ -- *) string : ARRAY OF CHAR;
  191.                        (* EIN/ -- *) links  : BOOLEAN       ): CARDINAL;
  192.  
  193.   PROCEDURE  RightPos ((* EIN/ -- *) muster : ARRAY OF CHAR;
  194.                        (* EIN/ -- *) start  : CARDINAL;
  195.                        (* EIN/ -- *) string : ARRAY OF CHAR;
  196.                        (* EIN/ -- *) links  : BOOLEAN       ): CARDINAL;
  197.  
  198. (*---------------------------------------------------------------------------
  199.  | Die Prozeduren suchen ab dem <start>-ten Zeichen ( vom Stringanfang ge-   |
  200.  | zaehlt ) zum Ende (Anfang) von                                            |
  201.  | <string> hin nach dem ersten Auftreten von <muster> in <string>.          |
  202.  | Zurueckgegeben wird die Position des ersten Zeichens von <muster> in      |
  203.  | <string> oder Null, falls <muster> nicht oder nicht vollstaendig in       |
  204.  | <string> auftritt.                                                        |
  205.  |                                                                           |
  206.  |  - Mit <links> laesst sich bestimmen, ob die Position des Musters vom     |
  207.  |    Anfang oder vom Ende von <string> gerechnet wird. Beispiel:            |
  208.  |      <string> = 'abcdefg', <muster> = 'bc',                               |
  209.  |    Falls <links> = TRUE, liefert LeftPos 2, sonst 6.                      |
  210.  |    Dadurch lassen sich auf einfache Weise "LeftStr" und "RightStr" benut- |
  211.  |    zen.                                                                   |
  212.  |  - <start> = 0: Bei "LeftPos"  <=> <start> = 1,                           |
  213.  |    bei "RightPos" <=> <start> = Length( quelle ) - Length( muster ) + 1,  |
  214.  |    d.h. es wird soweit rechts wie moeglich mit der Suche begonnen.        |
  215.  |  - Liegt <start> ausserhalb von <string>, oder ist <muster> ein Leer-     |
  216.  |    string, wird Null zurueckgegeben. Bei "RightPos" wird ein ausserhalb   |
  217.  |    des Strings liegendes <start> wie <start> = 0 behandelt.               |
  218.   ---------------------------------------------------------------------------*)
  219.  
  220.  
  221.  
  222.   PROCEDURE  LeftStr  ((* EIN/ -- *)     quelle : ARRAY OF CHAR;
  223.                        (* EIN/ -- *)     anzahl : CARDINAL;
  224.                        (* -- /AUS *) VAR ziel   : ARRAY OF CHAR;
  225.                        (* -- /AUS *) VAR vollst : BOOLEAN       );
  226.  
  227.   PROCEDURE  RightStr ((* EIN/ -- *)     quelle : ARRAY OF CHAR;
  228.                        (* EIN/ -- *)     anzahl : CARDINAL;
  229.                        (* -- /AUS *) VAR ziel   : ARRAY OF CHAR;
  230.                        (* -- /AUS *) VAR vollst : BOOLEAN       );
  231.  
  232. (*---------------------------------------------------------------------------
  233.  | Die Prozeduren kopieren die ersten (letzten) <anzahl> Zeichen von <quelle>|
  234.  | nach <ziel>.                                                              |
  235.  |  - Ist <anzahl> groesser als die Laenge von <quelle>, werden nur soviele  |
  236.  |    Zeichen kopiert wie <quelle> enthaelt.                                 |
  237.  |  - Ist <anzahl> gleich Null, wird <ziel> zum Leerstring.                  |
  238.  |  - Es werden nur soviele Zeichen kopiert, wie in <ziel> passen, musste    |
  239.  |    gekuerzt werden, gilt:   <vollst> = FALSE.                             |
  240.  |  - Als <anzahl> laesst sich gut das Ergebnis von "Left/RightPos" benutzen |
  241.   ---------------------------------------------------------------------------*)
  242.  
  243.  
  244.  
  245.   PROCEDURE  SubStr ((* EIN/ -- *)     quelle : ARRAY OF CHAR;
  246.                      (* EIN/ -- *)     start,
  247.                      (* EIN/ -- *)     laenge : CARDINAL;
  248.                      (* -- /AUS *) VAR ziel   : ARRAY OF CHAR;
  249.                      (* -- /AUS *) VAR vollst : BOOLEAN       );
  250.  
  251. (*---------------------------------------------------------------------------
  252.  | Kopiert ab dem <start>-ten Zeichen <laenge> Zeichen von <quelle> nach     |
  253.  | <ziel>.                                                                   |
  254.  |  - <start> = 0  <=>  <start> = 1.                                         |
  255.  |  - Liegt <start> ausserhalb von <quelle>, oder ist <laenge> gleich Null,  |
  256.  |    wird <ziel> zum Leerstring.                                            |
  257.  |  - Liegt <start> + <laenge> ausserhalb von <quelle>, wird nur bis zum Ende|
  258.  |    von <quelle> kopiert.                                                  |
  259.  |  - Es werden nur soviele Zeichen kopiert, wie in <ziel> passen, musste    |
  260.  |    gekuerzt werden, gilt:   <vollst> = FALSE.                             |
  261.   ---------------------------------------------------------------------------*)
  262.  
  263.  
  264.   PROCEDURE  CAPStr ((* EIN/ -- *)     quelle : ARRAY OF CHAR;
  265.                      (* -- /AUS *) VAR ziel   : ARRAY OF CHAR;
  266.                      (* -- /AUS *) VAR vollst : BOOLEAN       );
  267.  
  268. (*---------------------------------------------------------------------------
  269.  | Alle Kleinbuchstaben aus <quelle> werden in Grossbuchstaben umgewandelt   |
  270.  | und das Ergebnis <ziel> zugewiesen.                                       |
  271.  |  - Es werden nur soviele Zeichen kopiert, wie in <ziel> passen; musste    |
  272.  |    gekuerzt werden, gilt:   <vollst> = FALSE.                             |
  273.   ---------------------------------------------------------------------------*)
  274.  
  275.  
  276.  
  277.  
  278.   PROCEDURE  CharToStr ((* EIN/ -- *)     zeichen : CHAR;
  279.                         (* -- /AUS *) VAR string  : ARRAY OF CHAR );
  280.  
  281. (*---------------------------------------------------------------------------
  282.  | <string> wird zu einem String mit der Laenge eins und dem Zeichen         |
  283.  | <zeichen>. Die Prozedur ist gedacht fuer Funktionen, die nur mit Strings  |
  284.  | und nicht mit CHAR-Variablen arbeiten. Als platzsparender Stringtyp kann  |
  285.  | dafuer "StrChar" verwendet werden.                                        |
  286.   ---------------------------------------------------------------------------*)
  287.  
  288.  
  289.   PROCEDURE  AssignChar ((* EIN/ -- *)     zeichen: CHAR;
  290.                          (* EIN/ -- *)     pos    : CARDINAL;
  291.                          (* EIN/AUS *) VAR string : ARRAY OF CHAR );
  292.  
  293. (*---------------------------------------------------------------------------
  294.  | Das <pos>-te Zeichen von <string> wird durch <zeichen> ersetzt. Liegt     |
  295.  | <pos> ausserhalb des Strings, wird <string> nicht veraendert.             |
  296.  |                                                                           |
  297.  |  - Ist <zeichen> ein Nullbyte, hat der <string> danach die Laenge <pos>-1 |
  298.   ---------------------------------------------------------------------------*)
  299.  
  300.  
  301.   PROCEDURE  AppendChar ((* EIN/ -- *)     zeichen: CHAR;
  302.                          (* EIN/AUS *) VAR string : ARRAY OF CHAR;
  303.                          (* -- /AUS *) VAR vollst : BOOLEAN       );
  304.  
  305. (*---------------------------------------------------------------------------
  306.  | <zeichen> wird an das Ende von <string> geschrieben. Der String wird da-  |
  307.  | durch um ein Zeichen laenger, Ist der String nicht gross genug, das zu-   |
  308.  | saetzliche Zeichen aufzunehmen, wird <string> nicht veraendert, und es    |
  309.  | gilt:      <vollst> = FALSE                                               |
  310.  |                                                                           |
  311.  |  - Ist <zeichen> ein Nullbyte, wird <string> nicht veraendert, und es gilt|
  312.  |    vollst = TRUE                                                          |
  313.   ---------------------------------------------------------------------------*)
  314.  
  315.  
  316.   PROCEDURE  GetChar ((* EIN/ -- *) string : ARRAY OF CHAR;
  317.                       (* EIN/ -- *) pos    : CARDINAL      ): CHAR;
  318.  
  319. (*---------------------------------------------------------------------------
  320.  | Liefert das <pos>-te Zeichen von <string>. Liegt <pos> ausserhalb von     |
  321.  | <string> (0, > Length( string )), wird ein Nullbyte zurueckgeliefert.     |
  322.   ---------------------------------------------------------------------------*)
  323.  
  324.  
  325.   PROCEDURE  DeleteChar ((* EIN/AUS *) VAR string : ARRAY OF CHAR;
  326.                          (* EIN/ -- *)     pos    : CARDINAL      );
  327.  
  328. (*---------------------------------------------------------------------------
  329.  | Das <pos>-te Zeichen von <string> wird geloescht, der String wird dadurch |
  330.  | um ein Zeichen kuerzer. Liegt <pos> ausserhalb des Strings, wird das      |
  331.  | LETZTE Zeichen geloescht ( z.B. um ein "AppendChar" rueckgaengig zu       |
  332.  | machen. Ist <string> ein Leerstring, passiert nichts.                     |
  333.   ---------------------------------------------------------------------------*)
  334.  
  335.  
  336.   PROCEDURE  InsertChar ((* EIN/ -- *)     zeichen: CHAR;
  337.                          (* EIN/ -- *)     pos    : CARDINAL;
  338.                          (* EIN/AUS *) VAR string : ARRAY OF CHAR;
  339.                          (* -- /AUS *) VAR vollst : BOOLEAN       );
  340.  
  341. (*---------------------------------------------------------------------------
  342.  | An der Stelle <pos> wird <zeichen> in <string> eingefuegt, der String wird|
  343.  | dadurch um ein Zeichen laenger. Ist <string> nicht gross genug, das zu-   |
  344.  | saetzliche Zeichen aufzunehmen, geht das letzte Zeichen verloren, und es  |
  345.  | gilt:   <vollst> = FALSE.                                                 |
  346.  | Liegt <pos> ausserhalb des Strings, wird <zeichen> hinten angefuegt.      |
  347.  |                                                                           |
  348.  |  - Ist <zeichen> ein Nullbyte, wird <string> nicht veraendert, und es gilt|
  349.  |    vollst = TRUE                                                          |
  350.   ---------------------------------------------------------------------------*)
  351.  
  352. END  Strings.
  353.